package com.wyx.utils;

import io.jsonwebtoken.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

/**
 *  对用户信息利用JWT的方式设置加密解密功能
 * @ClassName LoginToken
 * @Description None
 * @Author 王玉星
 * @Date 2021/8/1 14:12
 * @Version 1.0
 */
public class TokenManager {

    //推荐用公司名
    private static String SALT = "con.wyx";
    // 过期时间 7 天
    private static Integer EXPIRE_TIME  = 1000*60*60*24*7;


    public static String encryption(Long id, String username){
        return encryption(id,username,"");
    }
    /**
     * 加密用户信息函数
     * @param id 用户Id
     * @param username 用户姓名
     * @param role  用户角色，输入时用,隔开。代表多个角色，形如 "admin,user"
     *
     * @return 经过JWT加密后的密文
     */
    public static String encryption(Long id, String username, String role){

        String[] roles = role.split(",");
        JwtBuilder jwtBuilder = Jwts.builder();
        String jwtPassword = jwtBuilder
                // header 设置
                .setHeaderParam("typ","JWT")
                .setHeaderParam("alg","HS256")
                // Payload 设置
                .claim("username",username)
                .claim("role",roles)
                .setExpiration(new Date(System.currentTimeMillis()+EXPIRE_TIME))
                // 设置 id
                .setId(String.valueOf(id))
                // Signature 设置，主要是加密方式，和加盐参数
                .signWith(SignatureAlgorithm.HS256,SALT)
                .compact();
        return jwtPassword;
    }

    /**
     * 解析一个加密的密文，并将他封装成 Map 对象返回，
     * username：用户名，
     * roles：角色，
     * id：用户ID，
     * expireTime：过期时间，
     * head_typ：加密类型，
     * head_alg：加密方式，
     * @param jwtPassword 加密的密文
     *
     * @return  封装了用户加密信息的 map 对象
     */
    public static HashMap jwtDecrypt(String jwtPassword){
        HashMap<String, Object> decryMap = new HashMap<>();
        // 传入加盐的参数，和加密对象,这里切记不能定义变量，一行写完
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SALT).parseClaimsJws(jwtPassword);
        // 解析Body（Payload）部分的值
        Claims body = claimsJws.getBody();
        decryMap.put("username", body.get("username"));
        decryMap.put("roles", body.get("role"));
        decryMap.put("id", body.getId());
        decryMap.put("expireTime", body.getExpiration());
        // 解析头部的值
        Header header = claimsJws.getHeader();
        decryMap.put("head_typ",header.get("typ"));
        decryMap.put("head_alg",header.get("alg"));
        return decryMap;
    }
}
